// common/mathUtils.js

/**
 * 精确加法
 * @param {number} num1 - 第一个数字
 * @param {number} num2 - 第二个数字
 * @returns {number} 计算结果
 */
export function add(num1, num2) {
  const precision = Math.max(getPrecision(num1), getPrecision(num2)); // 获取最大小数位数
  const multiplier = Math.pow(10, precision); // 放大倍数
  return (Math.round(num1 * multiplier) + Math.round(num2 * multiplier)) / multiplier;
}

/**
 * 精确减法
 * @param {number} num1 - 第一个数字
 * @param {number} num2 - 第二个数字
 * @returns {number} 计算结果
 */
export function subtract(num1, num2) {
  const precision = Math.max(getPrecision(num1), getPrecision(num2)); // 获取最大小数位数
  const multiplier = Math.pow(10, precision); // 放大倍数
  return (Math.round(num1 * multiplier) - Math.round(num2 * multiplier)) / multiplier;
}

/**
 * 精确乘法
 * @param {number} num1 - 第一个数字
 * @param {number} num2 - 第二个数字
 * @returns {number} 计算结果
 */
export function multiply(num1, num2) {
  const num1Str = num1.toString();
  const num2Str = num2.toString();

  // 获取 num1 和 num2 的小数位数
  const num1DecimalLength = (num1Str.split('.')[1] || '').length;
  const num2DecimalLength = (num2Str.split('.')[1] || '').length;

  // 将两个数转换为整数
  const integerNum1 = Number(num1Str.replace('.', ''));
  const integerNum2 = Number(num2Str.replace('.', ''));

  // 计算乘积
  const product = integerNum1 * integerNum2;

  // 计算总小数位数
  const totalDecimalLength = num1DecimalLength + num2DecimalLength;

  // 将结果缩小为正确的小数位数
  return product / Math.pow(10, totalDecimalLength);
}

/**
 * 精确除法
 * @param {number} num1 - 第一个数字
 * @param {number} num2 - 第二个数字
 * @returns {number} 计算结果
 */
export function divide(num1, num2) {
  const precision = getPrecision(num1) - getPrecision(num2); // 小数位数差
  const multiplier = Math.pow(10, precision); // 放大倍数
  return (Math.round(num1 * multiplier) / Math.round(num2 * multiplier)) / Math.pow(10, precision);
}

/**
 * 获取数字的小数位数
 * @param {number} num - 数字
 * @returns {number} 小数位数
 */
function getPrecision(num) {
  if (num === undefined || num === null || typeof num !== 'number') {
    return 0; // 如果 num 无效，返回默认值 0
  }
  const str = num.toString();
  const decimalIndex = str.indexOf('.');
  return decimalIndex === -1 ? 0 : str.length - decimalIndex - 1;
}